package com.bsfcs.rag.service;

import lombok.Getter;
import lombok.Setter;
import org.springframework.stereotype.Component;

import java.util.HashSet;
import java.util.Set;

/**
 * 合同数据查询配置类
 * 用于设置项目、合同、合同履行节点列表、付款记录列表、开票记录列表、进项发票记录列表的查询字段
 */
@Component
@Getter
@Setter
public class ContractDataQueryConfig {
    
    /**
     * 项目字段配置
     */
    private Set<String> projectFields = new HashSet<>();
    
    /**
     * 合同字段配置
     */
    private Set<String> contractFields = new HashSet<>();
    
    /**
     * 合同履行节点字段配置
     */
    private Set<String> contractLxPlanFields = new HashSet<>();
    
    /**
     * 付款记录字段配置
     */
    private Set<String> contractPaymoneyFields = new HashSet<>();
    
    /**
     * 开票记录字段配置
     */
    private Set<String> invoiceFields = new HashSet<>();
    
    /**
     * 进项发票记录字段配置
     */
    private Set<String> contractjxfpdjFields = new HashSet<>();
    
    /**
     * 构造函数，设置默认字段配置
     */
    public ContractDataQueryConfig() {
        setDefaultProjectFields();
        setDefaultContractFields();
        setDefaultContractLxPlanFields();
        setDefaultContractPaymoneyFields();
        setDefaultInvoiceFields();
        setDefaultContractjxfpdjFields();
    }
    
    /**
     * 设置项目字段
     * @param fields 字段列表
     */
    public void setProjectFields(String... fields) {
        this.projectFields.clear();
        for (String field : fields) {
            this.projectFields.add(field);
        }
    }
    
    /**
     * 设置合同字段
     * @param fields 字段列表
     */
    public void setContractFields(String... fields) {
        this.contractFields.clear();
        for (String field : fields) {
            this.contractFields.add(field);
        }
    }
    
    /**
     * 设置合同履行节点字段
     * @param fields 字段列表
     */
    public void setContractLxPlanFields(String... fields) {
        this.contractLxPlanFields.clear();
        for (String field : fields) {
            this.contractLxPlanFields.add(field);
        }
    }
    
    /**
     * 设置付款记录字段
     * @param fields 字段列表
     */
    public void setContractPaymoneyFields(String... fields) {
        this.contractPaymoneyFields.clear();
        for (String field : fields) {
            this.contractPaymoneyFields.add(field);
        }
    }
    
    /**
     * 设置开票记录字段
     * @param fields 字段列表
     */
    public void setInvoiceFields(String... fields) {
        this.invoiceFields.clear();
        for (String field : fields) {
            this.invoiceFields.add(field);
        }
    }
    
    /**
     * 设置进项发票记录字段
     * @param fields 字段列表
     */
    public void setContractjxfpdjFields(String... fields) {
        this.contractjxfpdjFields.clear();
        for (String field : fields) {
            this.contractjxfpdjFields.add(field);
        }
    }
    
    /**
     * 检查是否设置了项目字段
     * @return 如果设置了返回true，否则返回false
     */
    public boolean hasProjectFields() {
        return !this.projectFields.isEmpty();
    }
    
    /**
     * 检查是否设置了合同字段
     * @return 如果设置了返回true，否则返回false
     */
    public boolean hasContractFields() {
        return !this.contractFields.isEmpty();
    }
    
    /**
     * 检查是否设置了合同履行节点字段
     * @return 如果设置了返回true，否则返回false
     */
    public boolean hasContractLxPlanFields() {
        return !this.contractLxPlanFields.isEmpty();
    }
    
    /**
     * 检查是否设置了付款记录字段
     * @return 如果设置了返回true，否则返回false
     */
    public boolean hasContractPaymoneyFields() {
        return !this.contractPaymoneyFields.isEmpty();
    }
    
    /**
     * 检查是否设置了开票记录字段
     * @return 如果设置了返回true，否则返回false
     */
    public boolean hasInvoiceFields() {
        return !this.invoiceFields.isEmpty();
    }
    
    /**
     * 检查是否设置了进项发票记录字段
     * @return 如果设置了返回true，否则返回false
     */
    public boolean hasContractjxfpdjFields() {
        return !this.contractjxfpdjFields.isEmpty();
    }
    
    /**
     * 设置项目默认字段
     */
    public void setDefaultProjectFields() {
        // 默认只显示项目名称
        this.projectFields.add("project_name");
    }
    
    /**
     * 设置合同默认字段（已去除所有ID字段）
     */
    public void setDefaultContractFields() {
        // 基本编码、名称字段以及关键金额字段（去除ID字段）
//        this.contractFields.add("code");
        this.contractFields.add("name");
        this.contractFields.add("client_name");
        this.contractFields.add("contract_total_money");
        this.contractFields.add("yj_income");
        this.contractFields.add("yj_cost");
        this.contractFields.add("yj_ml");
        this.contractFields.add("yj_jl");
        this.contractFields.add("jhtje");
        // 添加项目名称字段
//        this.contractFields.add("cbxm_name");
        this.contractFields.add("signing_time");
        this.contractFields.add("begintime");
        this.contractFields.add("endtime");
        this.contractFields.add("jsfsname");
        this.contractFields.add("kxytname");
        this.contractFields.add("contract_biz_status");
        this.contractFields.add("cgfs_type");
        this.contractFields.add("purchase_enabled");
        this.contractFields.add("szhy");
        this.contractFields.add("scale");
        this.contractFields.add("contracting_party_orgname");
//        this.contractFields.add("signatory_id");
    }
    
    /**
     * 设置合同履行节点默认字段（已去除所有ID字段）
     */
    public void setDefaultContractLxPlanFields() {
        // 基本编码、名称字段以及关键金额字段（去除ID字段）
        this.contractLxPlanFields.add("name");
        this.contractLxPlanFields.add("payment_name");
        this.contractLxPlanFields.add("plan_perform_amount");
        this.contractLxPlanFields.add("real_perform_amount");
        this.contractLxPlanFields.add("amount_cashed");
        this.contractLxPlanFields.add("deduction_amount");
        this.contractLxPlanFields.add("deadline");
        this.contractLxPlanFields.add("real_perform_date");
        this.contractLxPlanFields.add("is_performed");
        // 添加项目和合同名称字段
        this.contractLxPlanFields.add("projectname");
    }
    
    /**
     * 设置付款记录默认字段（已去除所有ID字段）
     */
    public void setDefaultContractPaymoneyFields() {
        // 基本编码、名称字段以及关键金额字段（去除ID字段）
//        this.contractPaymoneyFields.add("billcode");
        this.contractPaymoneyFields.add("coll_unit_name");
        this.contractPaymoneyFields.add("all_money");
        this.contractPaymoneyFields.add("paid_money");
        this.contractPaymoneyFields.add("apply_money");
        this.contractPaymoneyFields.add("deduction_amount");
        this.contractPaymoneyFields.add("pay_time");
        this.contractPaymoneyFields.add("applicant_time");
        // 添加项目和合同名称字段
        this.contractPaymoneyFields.add("projectname");
    }
    
    /**
     * 设置开票记录默认字段（已去除所有ID字段）
     */
    public void setDefaultInvoiceFields() {
        // 基本编码、名称字段以及关键金额字段（去除ID字段）
//        this.invoiceFields.add("code");
        this.invoiceFields.add("client_name");
        this.invoiceFields.add("invoice_name");
        this.invoiceFields.add("tax_amount");
        this.invoiceFields.add("invoice_amount");
        this.invoiceFields.add("applicationdate");
        this.invoiceFields.add("expectedarrivaltime");
        this.invoiceFields.add("payment_name");
        this.invoiceFields.add("node_amount");
        // 添加项目和合同名称字段
        this.invoiceFields.add("projectname");
    }
    
    /**
     * 设置进项发票记录默认字段（已去除所有ID字段）
     */
    public void setDefaultContractjxfpdjFields() {
        // 基本编码、名称字段以及关键金额字段（去除ID字段）
//        this.contractjxfpdjFields.add("code");
        this.contractjxfpdjFields.add("clientname");
        this.contractjxfpdjFields.add("bill_code");
        this.contractjxfpdjFields.add("bill_num");
        this.contractjxfpdjFields.add("tax_money");
        this.contractjxfpdjFields.add("not_tax_money");
        this.contractjxfpdjFields.add("bill_date");
        // 添加项目和合同名称字段
        this.contractjxfpdjFields.add("projectname");
    }
    
    /**
     * 重置所有字段配置
     */
    public void resetAll() {
        this.projectFields.clear();
        this.contractFields.clear();
        this.contractLxPlanFields.clear();
        this.contractPaymoneyFields.clear();
        this.invoiceFields.clear();
        this.contractjxfpdjFields.clear();
        
        // 重新设置默认配置
        setDefaultProjectFields();
        setDefaultContractFields();
        setDefaultContractLxPlanFields();
        setDefaultContractPaymoneyFields();
        setDefaultInvoiceFields();
        setDefaultContractjxfpdjFields();
    }
    
    /**
     * 检查是否配置了任何字段
     * @return 如果配置了任何字段返回true，否则返回false
     */
    public boolean hasAnyFieldsConfigured() {
        return hasProjectFields() || hasContractFields() || hasContractLxPlanFields() 
                || hasContractPaymoneyFields() || hasInvoiceFields() || hasContractjxfpdjFields();
    }
    
    @Override
    public String toString() {
        return "ContractDataQueryConfig{" +
                "projectFields=" + projectFields +
                ", contractFields=" + contractFields +
                ", contractLxPlanFields=" + contractLxPlanFields +
                ", contractPaymoneyFields=" + contractPaymoneyFields +
                ", invoiceFields=" + invoiceFields +
                ", contractjxfpdjFields=" + contractjxfpdjFields +
                '}';
    }
}